#include "SerialConfig.h"


/**
 * @brief 加载所有端口到下拉列表中
 * @param 端口下拉列表
 */
void LoadPortToComboBox(QComboBox* combobox)
{
    int devNum = 0;
    int index = 0;
    QString selectItem = 0;
    QString devInfo = 0;

    if (combobox == nullptr)
        return;

    combobox->clear();

    foreach (const QSerialPortInfo& dev, QSerialPortInfo::availablePorts())
    {
        // 把搜索到的串口添加到下拉列表中
#ifdef Q_OS_WIN
        combobox->addItem(dev.portName());
#else
        combobox->addItem(dev.systemLocation());
#endif

        // 获取当前串口信息
        devInfo = dev.manufacturer() + " " + dev.description() + " " \
                + QString::number(dev.vendorIdentifier()) + ":" + QString::number(dev.productIdentifier());

#if QT_VERSION >= QT_VERSION_CHECK(5, 3, 0)
        devInfo += (" # " + dev.serialNumber());
#endif

        //qDebug() << devInfo + QString::number(devNum);
        // 当鼠标移动到当前项目上时，显示提示信息
        combobox->setItemData(devNum, devInfo, Qt::ToolTipRole);

        devNum++;
    }

    selectItem = combobox->currentText();
    index = combobox->findText(selectItem);
    //qDebug() << index;
    if (index != -1)
    {
        combobox->setCurrentIndex(index);
    }
    else
    {
        combobox->addItem(selectItem);
        combobox->setCurrentIndex(devNum);
    }
}

/**
 * @brief 加载所有可用波特率到下拉列表中
 * @param 波特率下拉列表
 */
void LoadBaudToComboBox(QComboBox* combobox)
{
    if (combobox == nullptr)
        return;

    foreach (const auto baud, QSerialPortInfo::standardBaudRates())
    {
        combobox->addItem(QString::number(baud), baud);
    }

    // 添加一条横线
    combobox->insertSeparator(90);

    // 添加自定义波特率选项
    combobox->addItem(QString("自定义"), -1);

    // 默认选择9600波特率
    combobox->setCurrentIndex(combobox->findText("9600"));
}

/**
 * @brief 解析用户选择的数据位
 * @param dataBit
 * @return
 */
QSerialPort::DataBits ParseDataBit(QString dataBit)
{
    if (QString::compare(dataBit, "5") == 0)
    {
        return QSerialPort::Data5;
    }
    else if (QString::compare(dataBit, "6") == 0)
    {
        return QSerialPort::Data6;
    }
    else if (QString::compare(dataBit, "7") == 0)
    {
        return QSerialPort::Data7;
    }
    else if (QString::compare(dataBit, "8") == 0)
    {
        return QSerialPort::Data8;
    }
    else
    {
        return QSerialPort::UnknownDataBits;
    }
}

/**
 * @brief 解析用户选择的停止位
 * @param stopBit
 * @return
 */
QSerialPort::StopBits ParseStopBit(QString stopBit)
{
    if (QString::compare(stopBit, "1") == 0)
    {
        return QSerialPort::OneStop;
    }
    else if (QString::compare(stopBit, "1.5") == 0)
    {
        return QSerialPort::OneAndHalfStop;;
    }
    else if (QString::compare(stopBit, "2") == 0)
    {
        return QSerialPort::TwoStop;
    }
    else
    {
        return QSerialPort::UnknownStopBits;
    }
}

/**
 * @brief 解析用户选择的校验方式
 * @param checkBit
 * @return
 */
QSerialPort::Parity ParseCheckBit(QString checkBit)
{
    if (QString::compare(checkBit, "None") == 0)
    {
        return QSerialPort::NoParity;
    }
    else if (QString::compare(checkBit, "Odd") == 0)
    {
        return QSerialPort::OddParity;
    }
    else if (QString::compare(checkBit, "Even") == 0)
    {
        return QSerialPort::EvenParity;
    }
    else
    {
        return QSerialPort::UnknownParity;
    }
}

/**
 * @brief 解析用户选择的流控制
 * @param streamControl
 * @return 0 无流控制
 *         1 硬件流控制
 *         2 软件流控制
 *        -1 error
 */
QSerialPort::FlowControl ParseStreamControl(QString streamControl)
{
    if (QString::compare(streamControl, "None") == 0)
    {
        return QSerialPort::NoFlowControl;
    }
    else if (QString::compare(streamControl, "Hardware") == 0)
    {
        return QSerialPort::HardwareControl;
    }
    else if (QString::compare(streamControl, "Software") == 0)
    {
        return QSerialPort::SoftwareControl;
    }
    else
    {
        return QSerialPort::UnknownFlowControl;
    }
}
